﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using CCL.SocketMessage;

namespace CCL.TableStructure
{
    /// <summary>
    /// 직렬화 가능한 Database의 ProjectMember Table을 제공합니다.
    /// </summary>
    public class ProjectMember : Table, ISerializable
    {
        /// <summary>
        /// 해당 Member가 속해있는 Project를 가져옵니다.
        /// </summary>
        public Project Project { get; private set; }
        //public int ProjectID { get; private set; }

        /// <summary>
        /// 해당 Member의 정보를 가져옵니다.
        /// </summary>
        public User UserInfo { get; private set; }
        //public int UserID { get; private set; }

        /// <summary>
        /// 해당 Member의 Permission(권한)을 가져옵니다.
        /// </summary>
        public byte Permission { get; private set; }

        /// <summary>
        /// 해당 Table의 총 Size
        /// </summary>
        public new const int TableSize =
                //sizeof(int) +                   // ProjectID
                //sizeof(int) +                   // UserID
                Project.TableSize +             // Project
                User.TableSize +                // UserInfo
                sizeof(byte);                   // Permission

        /// <summary>
        /// 새로운 ProjectMember Table 객체를 생성합니다.
        /// </summary>
        /// <param name="bytes">직렬화된 byte 배열</param>
        public ProjectMember(byte[] bytes)
        {
            //ProjectID = BitConverter.ToInt32(bytes, 0);
            //UserID = BitConverter.ToInt32(bytes, 4);

            byte[] temp;
            int start = 0;

            temp = new byte[Project.TableSize];
            Array.Copy(bytes, start, temp, 0, Project.TableSize);
            Project = new Project(temp);
            start += temp.Length;

            temp = new byte[User.TableSize];
            Array.Copy(bytes, start, temp, 0, User.TableSize);
            UserInfo = new User(temp);
            start += temp.Length;

            Permission = bytes[start];
        }

        /// <summary>
        /// 새로운 ProjectMember Table 객체를 생성합니다.
        /// </summary>
        /// <param name="project">해당 Member의 Project</param>
        /// <param name="user">해당 Member의 정보</param>
        /// <param name="perm">해당 Member의 Project 권한</param>
        public ProjectMember(Project project, User user, int perm)
        {
            Project = project;
            UserInfo = user;
            Permission = (byte)perm;
        }


        /// <summary>
        /// 바이트 배열로 직렬화 합니다.
        /// </summary>
        /// <returns>직렬화된 바이트 배열</returns>
        public byte[] GetByte()
        {
            byte[] bytes = new byte[GetSize()];

            byte[] temp;
            int startIdx = 0;

            temp = Project.GetByte();
            Array.Copy(temp, 0, bytes, startIdx, temp.Length);
            startIdx += temp.Length;

            temp = UserInfo.GetByte();
            Array.Copy(temp, 0, bytes, startIdx, temp.Length);
            startIdx += temp.Length;

            bytes[startIdx] = Permission;

            return bytes;
        }

        /// <summary>
        /// 직렬화 가능한 객체의 바이트 사이즈를 가져옵니다.
        /// </summary>
        /// <returns>직렬화된 바이트 사이즈</returns>
        public uint GetSize()
        {
            return TableSize;
        }
    }
}
